#pragma once


template <typename T>
class xlist;

template<typename T>
class _xlist_node
{

public: 
	_xlist_node(_xlist_node<T> * next, const T & data)
	{
		NOTIMPL
	}

	_xlist_node()
	{
		NOTIMPL
	}

	~_xlist_node()
	{
		NOTIMPL
	}
	_xlist_node<T> * m_next;
	T m_data;
};


template<typename T>
class _xlist_const_iterator
{

public: 
	_xlist_const_iterator(_xlist_node<T> * uptoNode, xlist<T> * container)
	{
		NOTIMPL
	}

	_xlist_const_iterator()
	{
		NOTIMPL
	}

	const T& operator*()
	{
		NOTIMPL
	}

	const T* operator->()
	{
		NOTIMPL
	}

	_xlist_const_iterator<T> operator++(XINT32)
	{
		NOTIMPL
	}

	_xlist_const_iterator<T> & operator++()
	{
		NOTIMPL
	}

	XUINT32 operator==(const _xlist_const_iterator<T> & rhs) const
	{
		NOTIMPL
	}

	XUINT32 operator!=(const _xlist_const_iterator<T> &)
	{
		NOTIMPL
	}

	_xlist_const_iterator<T> & operator=(const _xlist_const_iterator<T> & rhs)
	{

	}

	XUINT32 IsEnd()
	{
		NOTIMPL
	}
protected: 
	_xlist_node<T> * m_Upto;
	xlist<T> * m_Container;
};

template<typename T>
class _xlist_iterator :
	public _xlist_const_iterator<T>
{
public: 
	_xlist_iterator(_xlist_node<T> * uptoNode, xlist<T> * container)
	{
		NOTIMPL
	}

	_xlist_iterator()
	{
		NOTIMPL
	}

	T& operator*() const
	{
		NOTIMPL
	}

	T* operator->()
	{
		NOTIMPL
	}

	_xlist_iterator<T> operator++(XINT32)
	{
		NOTIMPL
	}

	_xlist_iterator<T> & operator++()
	{
		NOTIMPL
	}
};

template <typename T>
class xlist
{

	typedef void (* PFNattachmentFunction)(_xlist_node<T> *);
private: 
	xlist<T> & operator=(const xlist<T> &)
	{
		NOTIMPL
	}
public: 
	xlist()
	{
		NOTIMPL
	}
private: 
	xlist(const xlist<T> &)
	{
		NOTIMPL
	}
public: 
	typedef typename _xlist_iterator<T> iterator;
	typedef typename _xlist_const_iterator<T> const_iterator;

	~xlist()
	{
		NOTIMPL
	}

	HRESULT front(T&)
	{
		NOTIMPL
	}

	HRESULT back(T&)
	{
		NOTIMPL
	}

	XUINT32 size()
	{
		NOTIMPL
	}

	XUINT32 empty()
	{
		NOTIMPL
	}

	const_iterator begin() const
	{
		NOTIMPL
	}

	iterator begin()
	{
		NOTIMPL
	}

	const_iterator end() const
	{
		NOTIMPL
	}

	iterator end()
	{
		NOTIMPL
	}

	void clear()
	{
		NOTIMPL
	}

	HRESULT push_back(const T& val)
	{
		NOTIMPL
	}

	HRESULT push_front(const T&)
	{
		NOTIMPL
	}

	HRESULT pop_front()
	{
		NOTIMPL
	}
protected: 
	HRESULT RemoveNextNode(_xlist_node<T> *, T&)
	{
		NOTIMPL
	}

	HRESULT GetNodeData(_xlist_node<T> *, T&)
	{
		NOTIMPL
	}

	_xlist_node<T> * InternalRemoveNode(_xlist_node<T> * *)
	{
		NOTIMPL
	}
private: 
	HRESULT PushToEnd(PFNattachmentFunction attachmentFunction, _xlist_node<T> * endNode, const T& val)
	{
		NOTIMPL
	}

	void DecrementSize()
	{
		NOTIMPL
	}

	void ZeroSize()
	{
		NOTIMPL
	}

	void IncrementSize()
	{
		NOTIMPL
	}

	void ResetMembers()
	{
		NOTIMPL
	}

	void SetBothEnds(_xlist_node<T> * node)
	{
		NOTIMPL
	}

	void AppendToTail(_xlist_node<T> * node)
	{
		NOTIMPL
	}

	void PrependToHead(_xlist_node<T> *)
	{
		NOTIMPL
	}
protected: 
	_xlist_node<T> * m_head;
	_xlist_node<T> * m_tail;
	XUINT32 m_size;
};

